struct Container(i32, i32);
// 这个trait检查给定的2个项是否储存于容器中
// 并且能够获得容器的第一个或最后一个值。
trait Contains {
    // 在这里定义可以被方法使用的泛型类型
    type A;
    type B;
    fn contains(&self, _: &Self::A, _: &Self::B) -> bool;
    fn first(&self) -> i32;
    fn last(&self) -> i32;
}
impl Contains for Container {
    // 指出 `A` 和 `B` 是什么类型。如果 `input`（输入）类型
    // 为 `Container(i32, i32)`，那么 `output`（输出）类型
    // 会被确定为 `i32` 和 `i32`。
    type A = i32;
    type B = i32;
    //     `&Self::A`和`&Self::B`在这里也是合法的类型，
    fn contains(&self, a: &Self::A, b: &Self::B) -> bool {
        (&self.0 == a) && (&self.1 == b)
    }
    fn first(&self) -> Self::A {
        self.0
    }
    fn last(&self) -> Self::B {
        self.1
    }
}

// 容器`C` 就包含了`A`和`B`类型。鉴于此，必须指出`A`和`B`显得很麻烦。
fn difference<C>(container: &C) -> i32 where
    C: Contains,{
    container.last() - container.first()
    }
fn main() {
    let num_1 = 3;
    let num_2 = 10;
    let container = Container(num_1, num_2);
    println!("Does container contain {} and {}? {}", num_1, num_2, container.contains(&num_1, &num_2));
    println!("First element is: {}", container.first());
    println!("Last element is: {}", container.last());
    println!("The difference is: {}", difference(&container));
}
